package handler_sys

import (
	"go_web/internal/global"
	_ "go_web/internal/model"
	"go_web/internal/model/model_sys"
	"go_web/internal/repo/repo_sys"
	"go_web/internal/req/req_sys"
	"go_web/internal/service/service_sys"
	"go_web/pkg/req"
	"go_web/pkg/res"
	"go_web/pkg/utils"
	"net/http"
	"path/filepath"
	"strconv"

	"github.com/gin-gonic/gin"
)

type SysFileHandler struct {
	SysFileService *service_sys.SysFileService
}

func NewSysFileHandler(SysFileService *service_sys.SysFileService) *SysFileHandler {
	return &SysFileHandler{SysFileService}
}

// Detail 查询SysFile详情
// @Summary 查询SysFile详情
// @Tags SysFileHandler
// @Accept json
// @Produce json
// @Param id query string true "主键ID"
// @Success 200 {object} res.R[model_sys.SysFile] "SysFile"
// @Router /sys_file/detail [get]
func (h *SysFileHandler) Detail(ctx *gin.Context) {
	id := ctx.Query("id")
	id64, err := strconv.ParseInt(id, 10, 64)
	if err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": "无效的ID"})
		return
	}
	SysFile, err := h.SysFileService.Detail(ctx, id64)
	if err != nil {
		ctx.JSON(http.StatusOK, res.NewR[string]().Fail("查询不到"))
		return
	}
	ctx.JSON(http.StatusOK, res.NewR[model_sys.SysFile]().Ok(*SysFile))
}

// Page 分页查询SysFile
// @Summary 分页查询SysFile
// @Tags SysFileHandler
// @Accept json
// @Produce json
// @Param queryParams query req_sys.SysFilePageReq false "分页请求参数"
// @Success 200 {object} res.R[res.PageRes]
// @Router /sys_file/page [get]
func (h *SysFileHandler) Page(ctx *gin.Context) {
	var pageReq req_sys.SysFilePageReq
	if err := ctx.ShouldBindQuery(&pageReq); err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	page, err := h.SysFileService.Page(ctx, pageReq)
	if err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	ctx.JSON(http.StatusOK, res.NewR[res.PageRes]().Ok(*page))
}

// Add 创建SysFile
// @Summary 创建SysFile
// @Tags SysFileHandler
// @Accept json
// @Produce json
// @Param jsonParams body req_sys.SysFileAddReq true "SysFile"
// @Success 200 {object} res.R[int64] "操作结果"
// @Router /sys_file/add [post]
func (h *SysFileHandler) Add(ctx *gin.Context) {
	var reqSys req_sys.SysFileAddReq
	if err := ctx.ShouldBindJSON(&reqSys); err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	id, err := h.SysFileService.Add(ctx, reqSys)
	if err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	ctx.JSON(http.StatusOK, res.NewR[int64]().Ok(id))
}

// Edit 修改SysFile
// @Summary 修改SysFile
// @Tags SysFileHandler
// @Accept json
// @Produce json
// @Param jsonParams body req_sys.SysFileEditReq true "SysFile"
// @Success 200 {object} res.R[int64] "操作结果"
// @Router /sys_file/edit [post]
func (h *SysFileHandler) Edit(ctx *gin.Context) {
	var reqSys req_sys.SysFileEditReq
	if err := ctx.ShouldBindJSON(&reqSys); err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	n, err := h.SysFileService.Edit(ctx, reqSys)
	if err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	ctx.JSON(http.StatusOK, res.NewR[int64]().Ok(n))
}

// Delete 删除SysFile
// @Summary 删除SysFile
// @Tags SysFileHandler
// @Accept json
// @Produce json
// @Param jsonParams body req.IdsReq true "ID集合"
// @Success 200 {object} res.R[int64] "操作结果"
// @Router /sys_file/delete [post]
func (h *SysFileHandler) Delete(ctx *gin.Context) {
	var idsReq req.IdsReq
	if err := ctx.ShouldBindJSON(&idsReq); err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	n, err := h.SysFileService.Delete(ctx, idsReq)
	if err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	ctx.JSON(http.StatusOK, res.NewR[int64]().Ok(n))
}

// UploadMultiple 上传文件
// @Summary 上传文件
// @Tags SysFileHandler
// @Accept json
// @Produce json
// @Param files formData file true "上传文件"  // formData是文件字段名，true表示必填
// @Success 200 {object} res.R[string] "操作结果"
// @Router /sys_file/upload/multiple [post]
func (h *SysFileHandler) UploadMultiple(ctx *gin.Context) {
	form, err := ctx.MultipartForm()
	if err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	// 获取所有文件列表
	files := form.File["files"]
	if len(files) == 0 {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": "没有文件上传"})
		return
	}
	rootPath, err := filepath.Abs("./static/upload/")
	if err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	for _, file := range files {
		// 定义文件保存路径
		id := global.IdWorker.Generate().Int64()
		fileExtension := utils.GetFileExtension(file.Filename)
		savePath := rootPath + "\\" + strconv.FormatInt(id, 10) + "." + fileExtension
		if err := ctx.SaveUploadedFile(file, savePath); err != nil {
			ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
			return
		}
		sysFile := &model_sys.SysFile{
			ID:          id,
			Name:        file.Filename,
			Url:         "/static/upload/" + strconv.FormatInt(id, 10) + "." + fileExtension,
			Suffix:      fileExtension,
			IsTemporary: true,
			LocPos:      savePath,
		}
		err = repo_sys.SysFile.WithContext(ctx).Save(sysFile)
		if err != nil {
			ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
			return
		}
	}
	ctx.JSON(http.StatusOK, res.NewR[string]().Ok("文件已上传成功！若未被引用，则在2小时之后删掉！"))
}
